package GUI;

import Biblioteca.*;
import java.awt.event.KeyEvent;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;

import java.util.Iterator;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JProgressBar;
import javax.swing.filechooser.FileNameExtensionFilter;
import javax.swing.table.DefaultTableModel;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeModel;
import javax.swing.tree.TreeNode;

/**
 *
 * @author IS G2
 */
public class BibliotecaWindow extends javax.swing.JFrame {

    private Biblioteca biblioteca;
    private PlayerWindow ventanaPadre;
    private Cancion[] cancionesEnTabla;
    private ConfigBibliotecaWindow panelConfig;
    final String rutaArchivosGeneros = "./config/Generos.txt";
    final String rutaArchivoDirectorios = "./config/directorios.txt";
    final String rutaArchivoConfig = "./config/config.txt";
    private String rutaArchivoXml;

    /** Creates new form BibliotecaWindow
     * @param parentWindow
     */
    public BibliotecaWindow(PlayerWindow parentWindow) {
        initComponents();

        this.ventanaPadre = parentWindow;
        panelConfig = null;
        rutaArchivoXml = null;
        File f = new File(rutaArchivoConfig);
        if (f.exists()) {
            try {
                BufferedReader in = new BufferedReader(new FileReader(f));
                String linea = in.readLine();
                while (linea != null) {
                    if (linea.contains("biblioteca_defecto=")) {
                        rutaArchivoXml = linea.substring(linea.indexOf("=") + 1, linea.length() - 1);

                    }
                    linea = in.readLine();
                }
                in.close();
                if (rutaArchivoXml != null) {
                    LectorSAX lector = new LectorSAX(rutaArchivoXml, this);
                    this.biblioteca = lector.getBiblioteca();
                    if (this.biblioteca == null) {
                        this.biblioteca = new Biblioteca(rutaArchivosGeneros);
                    }
                    this.repintarArbol();
                }
            } catch (IOException e) {
            }
        }

    }

    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        splitPanel = new javax.swing.JSplitPane();
        tabPanel = new javax.swing.JTabbedPane();
        catScroll = new javax.swing.JScrollPane();
        catTree = new javax.swing.JTree();
        busquedaPanel = new javax.swing.JPanel();
        searchLabel = new javax.swing.JLabel();
        searchField = new javax.swing.JTextField();
        seachOptions = new javax.swing.JComboBox();
        botonBorrarCampo = new javax.swing.JButton();
        jScrollPane1 = new javax.swing.JScrollPane();
        jTable1 = new javax.swing.JTable();
        jProgressBar1 = new javax.swing.JProgressBar();
        playButton = new javax.swing.JButton();
        bibliotecaMenu = new javax.swing.JMenuBar();
        fileMenu = new javax.swing.JMenu();
        addMenuItem = new javax.swing.JMenuItem();
        deleteMenuItem = new javax.swing.JMenuItem();
        separator1 = new javax.swing.JPopupMenu.Separator();
        importMenuItem = new javax.swing.JMenuItem();
        exportMenuItem = new javax.swing.JMenuItem();
        separator2 = new javax.swing.JPopupMenu.Separator();
        exitMenuItem = new javax.swing.JMenuItem();
        optionsMenu = new javax.swing.JMenu();
        jMenuConfig = new javax.swing.JMenuItem();
        jMenuRefrescar = new javax.swing.JMenuItem();
        jMenuReproducir = new javax.swing.JMenuItem();

        setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);

        splitPanel.setDividerLocation(250);
        splitPanel.setLastDividerLocation(250);
        splitPanel.setMinimumSize(new java.awt.Dimension(400, 400));
        splitPanel.setName("splitPanel"); // NOI18N
        splitPanel.setPreferredSize(new java.awt.Dimension(300, 540));

        tabPanel.setMinimumSize(new java.awt.Dimension(210, 50));

        catTree.setModel(null);
        catTree.addTreeExpansionListener(new javax.swing.event.TreeExpansionListener() {
            public void treeCollapsed(javax.swing.event.TreeExpansionEvent evt) {
            }
            public void treeExpanded(javax.swing.event.TreeExpansionEvent evt) {
                catTreeTreeExpanded(evt);
            }
        });
        catTree.addTreeSelectionListener(new javax.swing.event.TreeSelectionListener() {
            public void valueChanged(javax.swing.event.TreeSelectionEvent evt) {
                catTreeValueChanged(evt);
            }
        });
        catScroll.setViewportView(catTree);

        tabPanel.addTab("Exploración de Categorías", catScroll);

        busquedaPanel.addComponentListener(new java.awt.event.ComponentAdapter() {
            public void componentShown(java.awt.event.ComponentEvent evt) {
                busquedaPanelComponentShown(evt);
            }
        });

        searchLabel.setText("Introduzca los criterios de Búsqueda");

        searchField.addKeyListener(new java.awt.event.KeyAdapter() {
            public void keyReleased(java.awt.event.KeyEvent evt) {
                searchFieldKeyReleased(evt);
            }
        });

        seachOptions.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "Todos", "Álbum", "Artista", "Género", "Título" }));
        seachOptions.setToolTipText("Seleccione la categoría de la búsqueda.");
        seachOptions.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                seachOptionsActionPerformed(evt);
            }
        });

        botonBorrarCampo.setText("Borrar");
        botonBorrarCampo.setFocusable(false);
        botonBorrarCampo.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                botonBorrarCampoActionPerformed(evt);
            }
        });

        javax.swing.GroupLayout busquedaPanelLayout = new javax.swing.GroupLayout(busquedaPanel);
        busquedaPanel.setLayout(busquedaPanelLayout);
        busquedaPanelLayout.setHorizontalGroup(
            busquedaPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(busquedaPanelLayout.createSequentialGroup()
                .addContainerGap()
                .addGroup(busquedaPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(seachOptions, 0, 232, Short.MAX_VALUE)
                    .addComponent(searchLabel)
                    .addGroup(busquedaPanelLayout.createSequentialGroup()
                        .addComponent(searchField, javax.swing.GroupLayout.PREFERRED_SIZE, 151, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addGap(18, 18, 18)
                        .addComponent(botonBorrarCampo, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)))
                .addContainerGap())
        );
        busquedaPanelLayout.setVerticalGroup(
            busquedaPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(busquedaPanelLayout.createSequentialGroup()
                .addContainerGap()
                .addComponent(searchLabel)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(busquedaPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(searchField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(botonBorrarCampo))
                .addGap(11, 11, 11)
                .addComponent(seachOptions, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(406, Short.MAX_VALUE))
        );

        tabPanel.addTab("Búsqueda", busquedaPanel);

        splitPanel.setLeftComponent(tabPanel);

        jTable1.setAutoCreateRowSorter(true);
        jTable1.setBackground(new java.awt.Color(102, 102, 102));
        jTable1.setModel(new javax.swing.table.DefaultTableModel(
            new Object [][] {

            },
            new String [] {
                "Pista", "Título", "Artista", "Álbum", "Género", "Año"
            }
        ) {
            Class[] types = new Class [] {
                java.lang.Integer.class, java.lang.Object.class, java.lang.Object.class, java.lang.Object.class, java.lang.Object.class, java.lang.Object.class
            };
            boolean[] canEdit = new boolean [] {
                false, false, false, false, false, false
            };

            public Class getColumnClass(int columnIndex) {
                return types [columnIndex];
            }

            public boolean isCellEditable(int rowIndex, int columnIndex) {
                return canEdit [columnIndex];
            }
        });
        jTable1.addKeyListener(new java.awt.event.KeyAdapter() {
            public void keyReleased(java.awt.event.KeyEvent evt) {
                jTable1KeyReleased(evt);
            }
        });
        jScrollPane1.setViewportView(jTable1);

        splitPanel.setRightComponent(jScrollPane1);

        jProgressBar1.setEnabled(false);

        playButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/images/button_play.png"))); // NOI18N
        playButton.setMnemonic('x');
        playButton.setBorder(null);
        playButton.setContentAreaFilled(false);
        playButton.setPressedIcon(new javax.swing.ImageIcon(getClass().getResource("/images/button_play_pressed.png"))); // NOI18N
        playButton.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                playButtonActionPerformed(evt);
            }
        });

        fileMenu.setMnemonic('A');
        fileMenu.setText("Archivo");

        addMenuItem.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_A, java.awt.event.InputEvent.CTRL_MASK));
        addMenuItem.setMnemonic('A');
        addMenuItem.setText("Añadir archivos a la biblioteca...");
        addMenuItem.setToolTipText("Añade archivos a la biblioteca");
        addMenuItem.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                addMenuItemActionPerformed(evt);
            }
        });
        fileMenu.add(addMenuItem);

        deleteMenuItem.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_D, java.awt.event.InputEvent.CTRL_MASK));
        deleteMenuItem.setMnemonic('E');
        deleteMenuItem.setText("Eliminar archivos");
        deleteMenuItem.setToolTipText("Elimina los archivos seleccionados de la biblioteca");
        deleteMenuItem.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                deleteMenuItemActionPerformed(evt);
            }
        });
        fileMenu.add(deleteMenuItem);
        fileMenu.add(separator1);

        importMenuItem.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_I, java.awt.event.InputEvent.CTRL_MASK));
        importMenuItem.setMnemonic('I');
        importMenuItem.setText("Importar biblioteca desde archivo");
        importMenuItem.setToolTipText("Importa una biblioteca");
        importMenuItem.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                importMenuItemActionPerformed(evt);
            }
        });
        fileMenu.add(importMenuItem);

        exportMenuItem.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_X, java.awt.event.InputEvent.CTRL_MASK));
        exportMenuItem.setMnemonic('X');
        exportMenuItem.setText("Exportar");
        exportMenuItem.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                exportMenuItemActionPerformed(evt);
            }
        });
        fileMenu.add(exportMenuItem);
        fileMenu.add(separator2);

        exitMenuItem.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_Q, java.awt.event.InputEvent.CTRL_MASK));
        exitMenuItem.setMnemonic('S');
        exitMenuItem.setText("Salir de la biblioteca");
        exitMenuItem.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                exitMenuItemActionPerformed(evt);
            }
        });
        fileMenu.add(exitMenuItem);

        bibliotecaMenu.add(fileMenu);

        optionsMenu.setMnemonic('O');
        optionsMenu.setText("Opciones");
        optionsMenu.setToolTipText("Onpciones de configuración");

        jMenuConfig.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_O, java.awt.event.InputEvent.CTRL_MASK));
        jMenuConfig.setMnemonic('C');
        jMenuConfig.setText("Configurar");
        jMenuConfig.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jMenuConfigActionPerformed(evt);
            }
        });
        optionsMenu.add(jMenuConfig);

        jMenuRefrescar.setMnemonic('R');
        jMenuRefrescar.setText("Refrescar");
        jMenuRefrescar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jMenuRefrescarActionPerformed(evt);
            }
        });
        optionsMenu.add(jMenuRefrescar);

        jMenuReproducir.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_P, java.awt.event.InputEvent.CTRL_MASK));
        jMenuReproducir.setText("Reproducir");
        jMenuReproducir.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jMenuReproducirActionPerformed(evt);
            }
        });
        optionsMenu.add(jMenuReproducir);

        bibliotecaMenu.add(optionsMenu);

        setJMenuBar(bibliotecaMenu);

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                    .addComponent(splitPanel, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, 899, Short.MAX_VALUE)
                    .addGroup(layout.createSequentialGroup()
                        .addComponent(jProgressBar1, javax.swing.GroupLayout.DEFAULT_SIZE, 871, Short.MAX_VALUE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                        .addComponent(playButton, javax.swing.GroupLayout.PREFERRED_SIZE, 18, javax.swing.GroupLayout.PREFERRED_SIZE)))
                .addContainerGap())
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                .addGap(28, 28, 28)
                .addComponent(splitPanel, javax.swing.GroupLayout.DEFAULT_SIZE, 521, Short.MAX_VALUE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false)
                    .addComponent(jProgressBar1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addComponent(playButton, javax.swing.GroupLayout.PREFERRED_SIZE, 18, Short.MAX_VALUE))
                .addContainerGap())
        );

        pack();
    }// </editor-fold>//GEN-END:initComponents

    /**
     * Botón salir pulsado.
     * Se oculta la ventana.
     * @param evt
     */
    private void exitMenuItemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_exitMenuItemActionPerformed
        this.setVisible(false);
    }//GEN-LAST:event_exitMenuItemActionPerformed
    /**
     * Añadir a la biblioteca, opción del menú.
     * Se muestra un diálogo para escoger
     * uno o varios archivos o directorios. Se añadirá la información de las canciones
     * que se encuentren a la biblioteca.
     * @param evt
     */
    private void addMenuItemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_addMenuItemActionPerformed

        JFileChooser fc = new JFileChooser(System.getProperty("user.home"));
        fc.setDialogTitle("Añadir a la biblioteca");
        FileNameExtensionFilter filter = new FileNameExtensionFilter("Archivo MP3", "mp3");
        fc.addChoosableFileFilter(filter);
        fc.removeChoosableFileFilter(fc.getAcceptAllFileFilter());
        fc.setDialogType(JFileChooser.OPEN_DIALOG);
        fc.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES);
        fc.setMultiSelectionEnabled(true);
        Hilo h;
        int result = fc.showOpenDialog(this);
        if (result == JFileChooser.APPROVE_OPTION) {
            File[] rutas = fc.getSelectedFiles();
            //Calcular numero de archivos
            int numTotal = 0;
            for (int i = 0; i < rutas.length; i++) {
                if (rutas[i].isDirectory()) {
                    numTotal += contarArchivos(rutas[i]);
                } else if (rutas[i].isFile()) {
                    numTotal++;
                }
            }
            //Barra de progreso
            this.jProgressBar1.setIndeterminate(false);
            this.jProgressBar1.setMaximum(numTotal);
            this.jProgressBar1.setValue(0);
            this.jProgressBar1.setEnabled(true);
            //this.jProgressBar1.setVisible(true);
            h = new Hilo(biblioteca, rutas, this);
            h.start();

        }
    }//GEN-LAST:event_addMenuItemActionPerformed
    /**
     * Función auxiliar para contar el número de archivos que hay en un directorio.
     * @param f Directorio
     * @return Número de archivos que hay en el subárbol.
     */
    private int contarArchivos(File f) {
        int contador = 0;
        File[] entradas = f.listFiles();
        for (int i = 0; i < entradas.length; i++) {
            if (entradas[i].isFile()) {
                contador++;
            } else if (entradas[i].isDirectory()) {
                contador += contarArchivos(entradas[i]);
            }
        }
        return contador;
    }

    /**
     * Exportar biblioteca, opción del menú.
     * Se muestra un diálogo para escoger la ruta y el nombre del archivo .xml que
     * se generará después. Este archivo contiene toda la información de la biblioteca
     * y puede usarse para cargarse posteriormente.
     * @param evt
     */
    private void exportMenuItemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_exportMenuItemActionPerformed
        JFileChooser fc = new JFileChooser(System.getProperty("user.home"));
        fc.setDialogTitle("Exportar biblioteca");
        fc.setDialogType(JFileChooser.SAVE_DIALOG);
        FileNameExtensionFilter filter = new FileNameExtensionFilter("Archivo XML", "xml");
        fc.addChoosableFileFilter(filter);
        fc.removeChoosableFileFilter(fc.getAcceptAllFileFilter());
        fc.setFileSelectionMode(JFileChooser.FILES_ONLY);
        fc.setMultiSelectionEnabled(false);
        int result = fc.showSaveDialog(this);
        if (result == JFileChooser.APPROVE_OPTION) {

            String ruta = fc.getSelectedFile().getAbsolutePath();
            File f = new File(ruta);
            if (!f.getName().contains(".xml")) {
                ruta = f.getAbsolutePath().concat(".xml");
                f = new File(ruta);
            }
            if (f.exists()) {
                int result2 = JOptionPane.showConfirmDialog(this, "El archivo seleccionado se sobreescribirá.", "Aviso", JOptionPane.YES_NO_OPTION);
                if (result2 == JOptionPane.YES_OPTION) {
                    this.biblioteca.toXml(ruta);
                }

            } else {
                this.biblioteca.toXml(ruta);
            }
            this.repintarArbol();
        }
    }//GEN-LAST:event_exportMenuItemActionPerformed
    /**
     * Se llama cuando se expande un nodo. Recupera el nodo expandido del evento y llama a repintarSeleccion
     * @param evt
     */
    private void catTreeTreeExpanded(javax.swing.event.TreeExpansionEvent evt) {//GEN-FIRST:event_catTreeTreeExpanded
        Object seleccionAux = evt.getPath().getLastPathComponent();
        Object seleccion = ((DefaultMutableTreeNode) seleccionAux).getUserObject();
        this.repintarSeleccion(seleccion, (TreeNode) seleccionAux);
    }//GEN-LAST:event_catTreeTreeExpanded
    /**
     * Se llama cuando se selecciona algo del árbol. Recupera el nodo expandido y llama a repintarSeleccion
     * @param evt
     */
    private void catTreeValueChanged(javax.swing.event.TreeSelectionEvent evt) {//GEN-FIRST:event_catTreeValueChanged
        Object seleccionAux = evt.getPath().getLastPathComponent();
        Object seleccion = ((DefaultMutableTreeNode) seleccionAux).getUserObject();
        this.repintarSeleccion(seleccion, (TreeNode) seleccionAux);
    }//GEN-LAST:event_catTreeValueChanged
    /**
     * Recupera las canciones seleccionadas en la lista y las manda reproducir usando enviarALaLista
     * @param evt
     */
    private void jMenuReproducirActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jMenuReproducirActionPerformed
        int[] indicesSeleccionados = this.jTable1.getSelectedRows();
        if (indicesSeleccionados.length == 0) {
            for (int i = 0; i < this.jTable1.getModel().getRowCount(); i++) {
                this.enviarALaLista(i);
                //this.enviarALaLista(this.cancionesEnTabla);
            }
        } else {
            for (int i = 0; i < indicesSeleccionados.length; i++) {
                this.enviarALaLista(indicesSeleccionados[i]);
            }
        }
    }//GEN-LAST:event_jMenuReproducirActionPerformed

    /**
     * Esta función se lanza al producirse el evento de escribir una nueva letra en el campo de búsqueda.
     * Automáticamente se realiza una búsqueda en la biblioteca y se actualiza la lista de canciones.
     * @param evt
     */
    private void searchFieldKeyReleased(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_searchFieldKeyReleased
        Object criterio = this.seachOptions.getSelectedItem();
        String aguja = this.searchField.getText();
        if (criterio.equals("Todos")) {
            this.cancionesEnTabla = this.biblioteca.buscarTodos(aguja);
        } else if (criterio.equals("Álbum")) {
            this.cancionesEnTabla = this.biblioteca.buscarAlbum(aguja);
        } else if (criterio.equals("Artista")) {
            this.cancionesEnTabla = this.biblioteca.buscarArtista(aguja);
        } else if (criterio.equals("Género")) {
            this.cancionesEnTabla = this.biblioteca.buscarGenero(aguja);
        } else if (criterio.equals("Título")) {
            this.cancionesEnTabla = this.biblioteca.buscarTitulo(aguja);
        } else {
        }
        this.repintarCanciones();
    }//GEN-LAST:event_searchFieldKeyReleased

    /**
     * Se ha mostrado el panel de búsqueda. Inicialmente se muestran todas las
     * canciones de la biblioteca en la tabla.
     * @param evt
     */
    private void busquedaPanelComponentShown(java.awt.event.ComponentEvent evt) {//GEN-FIRST:event_busquedaPanelComponentShown
        Iterator<String> iterador = this.biblioteca.getIndCanciones().iterator();
        this.searchField.setText("");
        int cont = 0;
        this.cancionesEnTabla = new Cancion[this.biblioteca.getIndCanciones().size()];
        HashMap<String, Cancion> tablaCanciones;
        tablaCanciones = this.biblioteca.getCanciones();
        while (iterador.hasNext()) {
            this.cancionesEnTabla[cont] = tablaCanciones.get(iterador.next());
            cont++;
        }
        this.repintarCanciones();
    }//GEN-LAST:event_busquedaPanelComponentShown

    /**
     * Botón borrar campo de búsqueda pulsado. Se borra el contenido del campo
     * de texto y se muestran todas las canciones en la tabla.
     * @param evt
     */
    private void botonBorrarCampoActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_botonBorrarCampoActionPerformed
        this.searchField.setText("");
        Iterator<String> iterador = this.biblioteca.getIndCanciones().iterator();

        int cont = 0;
        this.cancionesEnTabla = new Cancion[this.biblioteca.getIndCanciones().size()];
        HashMap<String, Cancion> tablaCanciones;
        tablaCanciones = this.biblioteca.getCanciones();
        while (iterador.hasNext()) {
            this.cancionesEnTabla[cont] = tablaCanciones.get(iterador.next());
            cont++;
        }
        this.repintarCanciones();
    }//GEN-LAST:event_botonBorrarCampoActionPerformed

    /**
     * Botón reproducir pulsado. Se envian las canciones que ahora mismo hay en la tabla a la lista de reproducción.
     * @param evt
     */
    private void playButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_playButtonActionPerformed
        int[] indicesSeleccionados = this.jTable1.getSelectedRows();
        if (indicesSeleccionados.length == 0) {
            for (int i = 0; i < this.jTable1.getModel().getRowCount(); i++) {
                this.enviarALaLista(i);
                //this.enviarALaLista(this.cancionesEnTabla);
            }
        } else {
            for (int i = 0; i < indicesSeleccionados.length; i++) {
                this.enviarALaLista(indicesSeleccionados[i]);
            }
        }
    }//GEN-LAST:event_playButtonActionPerformed

    private void importMenuItemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_importMenuItemActionPerformed
        JFileChooser fc = new JFileChooser(System.getProperty("user.home"));
        fc.setDialogTitle("Importar biblioteca");
        fc.setDialogType(JFileChooser.OPEN_DIALOG);
        FileNameExtensionFilter filter = new FileNameExtensionFilter("Archivo XML", "xml");
        fc.addChoosableFileFilter(filter);
        fc.removeChoosableFileFilter(fc.getAcceptAllFileFilter());
        fc.setFileSelectionMode(JFileChooser.FILES_ONLY);
        fc.setMultiSelectionEnabled(false);
        int result = fc.showOpenDialog(this);
        if (result == JFileChooser.APPROVE_OPTION) {
            String ruta = fc.getSelectedFile().getAbsolutePath();
            File f = new File(ruta);
            if (f.exists()) {
                LectorSAX lector = new LectorSAX(ruta, this);
                this.biblioteca = lector.getBiblioteca();
                this.repintarArbol();
            } else {
                JOptionPane.showMessageDialog(this, "No se ha encontrado el archivo", "No se encuentra", JOptionPane.INFORMATION_MESSAGE);
            }
        }


    }//GEN-LAST:event_importMenuItemActionPerformed

    private void jMenuConfigActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jMenuConfigActionPerformed
        if (panelConfig == null) {
            this.panelConfig = new ConfigBibliotecaWindow();
            panelConfig.setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE);
        }
        panelConfig.inicializar(this.rutaArchivoDirectorios);
        panelConfig.setVisible(true);
    }//GEN-LAST:event_jMenuConfigActionPerformed

    private void jMenuRefrescarActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jMenuRefrescarActionPerformed
        File[] rutas;
        Hilo h;

        //Primero borrar las canciones que no estén en disco.
        this.biblioteca.limpiarCancionesNoPresentes();
        //Después, si hay archivo de directorios y tiene alguno, se recargan en disco
        try {
            File f = new File(rutaArchivoDirectorios);
            if (!f.exists()) {
                rutas = null;
            } else {
                BufferedReader in = new BufferedReader(new FileReader(f));
                String linea = in.readLine();
                int contador = 0;
                while (linea != null) {
                    contador++;
                    linea = in.readLine();
                }
                in.close();
                rutas = new File[contador];
                in = null;
                in = new BufferedReader(new FileReader(rutaArchivoDirectorios));
                linea = in.readLine();
                contador = 0;
                while (linea != null) {
                    rutas[contador] = new File(linea);
                    contador++;
                    linea = in.readLine();
                }
                //Calcular numero de archivos
                int numTotal = 0;
                for (int i = 0; i < rutas.length; i++) {
                    if (rutas[i].isDirectory()) {
                        numTotal += contarArchivos(rutas[i]);
                    } else if (rutas[i].isFile()) {
                        numTotal++;
                    }
                }
                //Barra de progreso
                this.jProgressBar1.setIndeterminate(false);
                this.jProgressBar1.setMaximum(numTotal);
                this.jProgressBar1.setValue(0);
                this.jProgressBar1.setEnabled(true);
                h = new Hilo(biblioteca, rutas, this);
                h.start();
            }
        } catch (IOException e) {
        }

    }//GEN-LAST:event_jMenuRefrescarActionPerformed

    private void jTable1KeyReleased(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_jTable1KeyReleased
        if ((jTable1.getRowCount() > 0) && (evt.getKeyCode() == KeyEvent.VK_DELETE)) {
            Cancion[] canciones;
            int[] indicesSeleccionados = this.jTable1.getSelectedRows();
            canciones = new Cancion[indicesSeleccionados.length];
            for (int i = 0; i < indicesSeleccionados.length; i++) {
                canciones[i] = (Cancion) this.jTable1.getModel().getValueAt(this.jTable1.convertRowIndexToModel(indicesSeleccionados[i]), 1);
            }
            for (int i = canciones.length - 1; i >= 0; i--) {
                if (this.biblioteca.eliminarCancion(canciones[i])) {
                    vaciarFila(this.jTable1.convertRowIndexToModel(indicesSeleccionados[i]));
                }

            }
            //this.jTable1.repaint();
            this.repintarArbol();
        } else if (evt.getKeyCode() == KeyEvent.VK_ENTER) {
            int[] indicesSeleccionados = this.jTable1.getSelectedRows();
            if (indicesSeleccionados.length == 0) {
                for (int i = 0; i < this.jTable1.getModel().getRowCount(); i++) {
                    this.enviarALaLista(i);
                    //this.enviarALaLista(this.cancionesEnTabla);
                }
            } else {
                for (int i = 0; i < indicesSeleccionados.length; i++) {
                    this.enviarALaLista(indicesSeleccionados[i]);
                }
            }
        }

    }//GEN-LAST:event_jTable1KeyReleased

    private void seachOptionsActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_seachOptionsActionPerformed
        Object criterio = this.seachOptions.getSelectedItem();
        String aguja = this.searchField.getText();
        if (criterio.equals("Todos")) {
            this.cancionesEnTabla = this.biblioteca.buscarTodos(aguja);
        } else if (criterio.equals("Álbum")) {
            this.cancionesEnTabla = this.biblioteca.buscarAlbum(aguja);
        } else if (criterio.equals("Artista")) {
            this.cancionesEnTabla = this.biblioteca.buscarArtista(aguja);
        } else if (criterio.equals("Género")) {
            this.cancionesEnTabla = this.biblioteca.buscarGenero(aguja);
        } else if (criterio.equals("Título")) {
            this.cancionesEnTabla = this.biblioteca.buscarTitulo(aguja);
        } else {
        }
        this.repintarCanciones();
    }//GEN-LAST:event_seachOptionsActionPerformed

    private void deleteMenuItemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_deleteMenuItemActionPerformed
        Cancion[] canciones;
        int[] indicesSeleccionados = this.jTable1.getSelectedRows();
        canciones = new Cancion[indicesSeleccionados.length];
        for (int i = 0; i < indicesSeleccionados.length; i++) {
            canciones[i] = (Cancion) this.jTable1.getModel().getValueAt(this.jTable1.convertRowIndexToModel(indicesSeleccionados[i]), 1);
        }
        for (int i = canciones.length - 1; i >= 0; i--) {
            if (this.biblioteca.eliminarCancion(canciones[i])) {
                vaciarFila(this.jTable1.convertRowIndexToModel(indicesSeleccionados[i]));
            }
        }
        this.repintarArbol();
    }//GEN-LAST:event_deleteMenuItemActionPerformed

    /**
     * Copia un arraylist al array de Cancion cancionesEnTabla
     * @param array
     */
    private void copiarAArrayTabla(ArrayList<Cancion> array) {
        Iterator<Cancion> iterador = array.iterator();
        this.cancionesEnTabla = new Cancion[array.size()];
        int cont = 0;
        while (iterador.hasNext()) {
            this.cancionesEnTabla[cont] = iterador.next();
            cont++;
        }
    }

    /**Repinta la biblioteca en el árbol**/
    public void repintarArbol() {
        if (biblioteca != null) {
            DefaultMutableTreeNode top = new DefaultMutableTreeNode("Biblioteca", true);
            //Chorrete de categorias.
            DefaultMutableTreeNode categoriaArtistas = null;
            DefaultMutableTreeNode categoriaUnArtista = null;
            DefaultMutableTreeNode categoriaAlbumes = null;
            DefaultMutableTreeNode categoriaUnAlbum = null;
            DefaultMutableTreeNode categoriaCanciones = null;
            DefaultMutableTreeNode categoriaGeneros = null;

            //Chorrete de iteradores
            Iterator<String> iteradorString;
            Iterator<Album> iteradorAlbum;
            Iterator<Cancion> iteradorCancion;

            Artista unArtista;
            Album unAlbum;
            Cancion unaCancion;

            HashMap<String, Artista> tablaArtistas = biblioteca.getArtistas();
            iteradorString = biblioteca.getIndArtistas().iterator();
            categoriaArtistas = new DefaultMutableTreeNode("Artistas");
            top.add(categoriaArtistas);
            //Para cada artista
            //Artistas
            while (iteradorString.hasNext()) {
                //Tiro el nodo con el artista
                //Artistas
                //->Manolito
                unArtista = biblioteca.getArtistas().get(iteradorString.next());
                categoriaUnArtista = new DefaultMutableTreeNode(unArtista);
                categoriaArtistas.add(categoriaUnArtista);

                //Tiro un hijo suyo Álbumes
                //Artistas
                //->Manolito
                //--->Álbumes
                categoriaAlbumes = new DefaultMutableTreeNode("Álbumes");
                categoriaUnArtista.add(categoriaAlbumes);
                iteradorAlbum = unArtista.getAlbumes().iterator();
                //Para cada álbum del artista
                while (iteradorAlbum.hasNext()) {
                    unAlbum = iteradorAlbum.next();
                    //Tiro un nodo con el álbum
                    //Artistas
                    //->Manolito
                    //--->Álbumes
                    //------>Alegrías y penas
                    categoriaUnAlbum = new DefaultMutableTreeNode(unAlbum);
                    categoriaAlbumes.add(categoriaUnAlbum);
                    //Para cada canción del álbum, tiro un nodo como su hijo
                    iteradorCancion = unAlbum.getCanciones().iterator();
                    while (iteradorCancion.hasNext()) {
                        //Artistas
                        //->Manolito
                        //--->Álbumes
                        //------>Alegrías y penas
                        //-------->Cancion 1.
                        unaCancion = iteradorCancion.next();
                        categoriaUnAlbum.add(new DefaultMutableTreeNode(unaCancion));
                    }
                }
                //Artistas
                //->Manolito
                //--->Álbumes
                //------>Alegrías y penas
                //-------->Cancion 1.
                //--->Canciones
                categoriaCanciones = new DefaultMutableTreeNode("Canciones");
                categoriaUnArtista.add(categoriaCanciones);
                iteradorCancion = unArtista.getCanciones().iterator();
                while (iteradorCancion.hasNext()) {
                    //Artistas
                    //->Manolito
                    //--->Álbumes
                    //------>Alegrías y penas
                    //-------->Cancion 1.
                    //--->Canciones
                    //-------->Cancion 1
                    unaCancion = iteradorCancion.next();
                    categoriaCanciones.add(new DefaultMutableTreeNode(unaCancion));
                }

            }
            //Artistas
            //->Manolito
            //--->Álbumes
            //------>Alegrías y penas
            //-------->Cancion 1.
            //--->Canciones
            //-------->Cancion 1
            //Álbumes
            categoriaAlbumes = new DefaultMutableTreeNode("Álbumes");
            top.add(categoriaAlbumes);
            iteradorString = this.biblioteca.getIndAlbumes().iterator();
            while (iteradorString.hasNext()) {
                //Artistas
                //->Manolito
                //--->Álbumes
                //------>Alegrías y penas
                //-------->Cancion 1.
                //--->Canciones
                //-------->Cancion 1
                //Álbumes
                //--->Alegrías y penas
                unAlbum = this.biblioteca.getAlbumes().get(iteradorString.next());
                categoriaUnAlbum = new DefaultMutableTreeNode(unAlbum);
                categoriaAlbumes.add(categoriaUnAlbum);
                iteradorCancion = unAlbum.getCanciones().iterator();

                while (iteradorCancion.hasNext()) {
                    //Artistas
                    //->Manolito
                    //--->Álbumes
                    //------>Alegrías y penas
                    //-------->Cancion 1.
                    //--->Canciones
                    //-------->Cancion 1
                    //Álbumes
                    //--->Alegrías y penas
                    //----->Cancion 1
                    categoriaUnAlbum.add(new DefaultMutableTreeNode(iteradorCancion.next()));
                }


            }
            //Artistas
            //->Manolito
            //--->Álbumes
            //------>Alegrías y penas
            //-------->Cancion 1.
            //--->Canciones
            //-------->Cancion 1
            //Álbumes
            //--->Alegrías y penas
            //----->Cancion 1
            //Canciones
            categoriaCanciones = new DefaultMutableTreeNode("Canciones");
            top.add(categoriaCanciones);
            iteradorString = biblioteca.getIndCanciones().iterator();
            while (iteradorString.hasNext()) {
                //Artistas
                //->Manolito
                //--->Álbumes
                //------>Alegrías y penas
                //-------->Cancion 1.
                //--->Canciones
                //-------->Cancion 1
                //Álbumes
                //--->Alegrías y penas
                //----->Cancion 1
                //Canciones
                //->Canción 1
                categoriaCanciones.add(new DefaultMutableTreeNode(biblioteca.getCanciones().get(iteradorString.next())));
            }
            //Artistas
            //->Manolito
            //--->Álbumes
            //------>Alegrías y penas
            //-------->Cancion 1.
            //--->Canciones
            //-------->Cancion 1
            //Álbumes
            //--->Alegrías y penas
            //----->Cancion 1
            //Canciones
            //->Canción 1
            //Géneros
            categoriaGeneros = new DefaultMutableTreeNode("Géneros");
            top.add(categoriaGeneros);
            iteradorString = biblioteca.getIndGeneros().iterator();
            while (iteradorString.hasNext()) {
                //Artistas
                //->Manolito
                //--->Álbumes
                //------>Alegrías y penas
                //-------->Cancion 1.
                //--->Canciones
                //-------->Cancion 1
                //Álbumes
                //--->Alegrías y penas
                //----->Cancion 1
                //Canciones
                //->Canción 1
                //Géneros
                //->Flamenco
                categoriaGeneros.add(new DefaultMutableTreeNode(biblioteca.getGeneros().get(iteradorString.next())));

            }
            this.catTree.setModel(new DefaultTreeModel(top));
            this.catTree.repaint();
        }
    }

    /**
     * Pinta una canción al final de la tabla.
     * @param cancion Canción para pintar.
     */
    private void pintarUnaCancion(Cancion cancion) {
        Object[] data;
        data = new Object[6];
        String pista;
        pista = cancion.getTag("pista");
        if ((pista != null) && !pista.equals("Desconocido")) {
            try {
                data[0] = new Integer(Integer.parseInt(pista));
            } catch (NumberFormatException e) {
                data[0] = null;
            }
        } else {
            data[0] = null;
        }
        //data[1] = cancion.getTitulo();
        data[1] = cancion;
        data[2] = cancion.getArtista().toString();
        data[3] = cancion.getAlbum().toString();
        data[4] = cancion.getGenero().toString();
        data[5] = cancion.getTag("año");
        ((DefaultTableModel) this.jTable1.getModel()).addRow(data);

    }

    /**
     * Vacía una fila de la tabla.
     * @param fila
     */
    private void vaciarFila(int fila) {
        DefaultTableModel antes = (DefaultTableModel) this.jTable1.getModel();
        antes.removeRow(fila);
    }

    /**
     * Repinta las canciones del array cancionesEnTabla en la tabla.
     */
    private void repintarCanciones() {
        while (this.jTable1.getRowCount() > 0) {
            this.vaciarFila(0);
        }

        for (int i = 0; i < this.cancionesEnTabla.length; i++) {
            this.pintarUnaCancion(this.cancionesEnTabla[i]);
        }

    }

    /**
     * Repinta la selección en la tabla.
     * @param seleccion Seleccion (Object para trabajar con el arbol)
     */
    private void repintarSeleccion(Object seleccion, TreeNode seleccionNodo) {

        //Capturar la selección realizada y obtener su lista de canciones.
        //Rellenar cancionesEnTabla con las canciones que se quieren mostrar
        if (seleccion.getClass() == Artista.class) {
            this.copiarAArrayTabla(((Artista) seleccion).getCanciones());
            this.repintarCanciones();
        } else if (seleccion.getClass() == Genero.class) {
            this.copiarAArrayTabla(((Genero) seleccion).getCanciones());
            this.repintarCanciones();
        } else if (seleccion.getClass() == Album.class) {
            this.copiarAArrayTabla(((Album) seleccion).getCanciones());
            this.repintarCanciones();
        } else if (seleccion.getClass() == Cancion.class) {
            this.cancionesEnTabla = new Cancion[1];
            cancionesEnTabla[0] = ((Cancion) seleccion);
            this.repintarCanciones();
        } else if (seleccion.getClass() == String.class) {
            if (seleccion.equals("Biblioteca")) {
                Iterator<String> iterador = this.biblioteca.getIndCanciones().iterator();

                int cont = 0;
                this.cancionesEnTabla = new Cancion[this.biblioteca.getIndCanciones().size()];
                HashMap<String, Cancion> tablaCanciones;
                tablaCanciones = this.biblioteca.getCanciones();
                while (iterador.hasNext()) {
                    this.cancionesEnTabla[cont] = tablaCanciones.get(iterador.next());
                    cont++;
                }
                this.repintarCanciones();
            } else if (seleccion.equals("Artistas")) {
            } else if (seleccion.equals("Canciones")) {
                if (seleccionNodo.getParent().equals(((DefaultTreeModel) this.catTree.getModel()).getRoot())) {
                    Iterator<String> iterador = this.biblioteca.getIndCanciones().iterator();
                    int cont = 0;
                    this.cancionesEnTabla = new Cancion[this.biblioteca.getIndCanciones().size()];
                    HashMap<String, Cancion> tablaCanciones;
                    tablaCanciones = this.biblioteca.getCanciones();
                    while (iterador.hasNext()) {
                        this.cancionesEnTabla[cont] = tablaCanciones.get(iterador.next());
                        cont++;
                    }
                    this.repintarCanciones();
                }

            } else if (seleccion.equals("Álbumes")) {
            } else if (seleccion.equals("Géneros")) {
            }
        }

    }

    /**
     * Envia a la lista de reproducción las cancion en la fila indice de la tabla.
     * @param indice Fila de la canción en la tabla.
     */
    private void enviarALaLista(int indice) {
        Cancion actual;
        actual = (Cancion) this.jTable1.getModel().getValueAt(this.jTable1.convertRowIndexToModel(indice), 1);
        actual = new Cancion(actual.getRuta());
        actual.cargarCancionIndependiente();
        this.ventanaPadre.aniadirCancion(actual);
    }

    /**
     * Envia un arraylist de canción a la lista de reproducción, añadiéndola al objeto lista y al songlistarea.
     * @param array
     */
    private void enviarALaLista(ArrayList<Cancion> array) {
        Iterator<Cancion> iterador = array.iterator();
        Cancion actual;
        while (iterador.hasNext()) {
            actual = iterador.next();
            this.ventanaPadre.aniadirCancion(actual);
        }
    }

    /**
     * Envia una canción a la lista de reproducción, añadiéndola al objeto lista y al songlistarea.
     * @param cancion
     */
    private void enviarALaLista(Cancion cancion) {
        this.ventanaPadre.aniadirCancion(cancion);

    }

    /**
     * Envia un Array canción a la lista de reproducción, añadiéndola al objeto lista y al songlistarea.
     * @param array
     */
    private void enviarALaLista(Cancion[] array) {
        Cancion actual;
        for (int i = 0; i < array.length; i++) {
            actual = array[i];
            this.ventanaPadre.aniadirCancion(actual);
        }
    }

    /**
     * devuelve barra progreso
     * @return JProgressBar
     */
    public JProgressBar getBarraProgreso() {
        return this.jProgressBar1;
    }

    /**
     * Al cerrarse, se graba en el xml por defecto la biblioteca actual.
     * Es llamado al cerrar el programa.
     * @see PlayerWindow
     */
    public void cerrando() {
        if (this.rutaArchivoXml != null) {
            this.biblioteca.toXml(rutaArchivoXml);
        }
    }

    /**
     * Intenta capturar la selección del árbol y enviarla a la lista.
     * No está terminado.
     * @deprecated
     * @param seleccion
     */
    private void mandarReproducir(Object seleccion) {
        //Capturar la selección realizada y obtener su lista de canciones.
        //Rellenar cancionesEnTabla con las canciones que se quieren mostrar
        if (seleccion.getClass() == Artista.class) {
            this.enviarALaLista(((Artista) seleccion).getCanciones());

        } else if (seleccion.getClass() == Genero.class) {
            this.enviarALaLista(((Genero) seleccion).getCanciones());
        } else if (seleccion.getClass() == Album.class) {
            this.enviarALaLista(((Album) seleccion).getCanciones());
        } else if (seleccion.getClass() == Cancion.class) {
            this.cancionesEnTabla = new Cancion[1];
            cancionesEnTabla[0] = ((Cancion) seleccion);
        } else if (seleccion.getClass() == String.class) {
            if (seleccion.equals("Biblioteca")) {
                Iterator<String> iterador = this.biblioteca.getIndCanciones().iterator();
                this.cancionesEnTabla = new Cancion[this.biblioteca.getIndCanciones().size()];
                HashMap<String, Cancion> tablaCanciones;
                tablaCanciones = this.biblioteca.getCanciones();
                while (iterador.hasNext()) {
                    this.ventanaPadre.getLista().aniadirCancion(tablaCanciones.get(iterador.next()));
                }
            } else if (seleccion.equals("Artistas")) {
            } else if (seleccion.equals("Canciones")) {
                Iterator<String> iterador = this.biblioteca.getIndCanciones().iterator();
                this.cancionesEnTabla = new Cancion[this.biblioteca.getIndCanciones().size()];
                HashMap<String, Cancion> tablaCanciones;
                tablaCanciones = this.biblioteca.getCanciones();
                while (iterador.hasNext()) {
                    this.ventanaPadre.getLista().aniadirCancion(tablaCanciones.get(iterador.next()));
                }
            } else if (seleccion.equals("Álbumes")) {
            } else if (seleccion.equals("Géneros")) {
            }
        }
    }

    /**
     * Carga una canción desde el archivo f.
     * @param f Archivo de la canción a cargar.
     * @return Cierto si ha habido éxito, falso en caso contrario.
     */
    public boolean cargarCancionDeArchivo(File f) {
        return biblioteca.cargarCancionDeArchivo(f);
    }
    
    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JMenuItem addMenuItem;
    private javax.swing.JMenuBar bibliotecaMenu;
    private javax.swing.JButton botonBorrarCampo;
    private javax.swing.JPanel busquedaPanel;
    private javax.swing.JScrollPane catScroll;
    private javax.swing.JTree catTree;
    private javax.swing.JMenuItem deleteMenuItem;
    private javax.swing.JMenuItem exitMenuItem;
    private javax.swing.JMenuItem exportMenuItem;
    private javax.swing.JMenu fileMenu;
    private javax.swing.JMenuItem importMenuItem;
    private javax.swing.JMenuItem jMenuConfig;
    private javax.swing.JMenuItem jMenuRefrescar;
    private javax.swing.JMenuItem jMenuReproducir;
    private javax.swing.JProgressBar jProgressBar1;
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JTable jTable1;
    private javax.swing.JMenu optionsMenu;
    private javax.swing.JButton playButton;
    private javax.swing.JComboBox seachOptions;
    private javax.swing.JTextField searchField;
    private javax.swing.JLabel searchLabel;
    private javax.swing.JPopupMenu.Separator separator1;
    private javax.swing.JPopupMenu.Separator separator2;
    private javax.swing.JSplitPane splitPanel;
    private javax.swing.JTabbedPane tabPanel;
    // End of variables declaration//GEN-END:variables
}
